package control;

import java.util.Hashtable;
import java.util.Map;

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import cliente_admin.ClienteAdmin;
import cliente_admin.ModuloConsultas;

import common.Mensaje;
import common.MensajeConsulta;
import componentesAux.CreadorTablas;
import componentesAux.ParsearRtdos;

public class Control {
	@FXML private StackPane stackPane;
	@FXML private Button boton1;
	@FXML private Button boton2;
	@FXML private Pane innPanel1;
	@FXML private Pane innPanel2;
	
	@FXML private GridPane grillaSesion;
	@FXML private Button botonGrilla;
	
	// componentes del panel de login
	@FXML private Pane p_login;
	@FXML private PasswordField pass_field;
	@FXML private Label l_login;
	
	
	@FXML private AnchorPane p_admin; // panel con las pestañas y eso
	// componentes del panel de control
	@FXML private Pane p_bienvenidos;
	@FXML private Pane p_aceptando;
	@FXML private Pane p_nuevo_tema;
	@FXML private Pane p_iniciar_votacion;
	@FXML private Pane p_en_votacion;
	@FXML private Pane p_rtdos;
	@FXML private Pane p_no_hay_quorum;
	
	@FXML private Button b_salir;
	@FXML private VBox botones_rtdos;
	@FXML private Button b_cerrar_sesion;
	@FXML private Button b_nuevo_tema;
	@FXML private Label l_comment_rtdos;
	
	@FXML private TextField tf_tema;
	
	@FXML private Label l_tema_actual_iv;
	@FXML private Label l_tema_actual_ev;
	@FXML private Label l_tema_actual_r;
	
	@FXML private Label l_rtdos_p;
	@FXML private Label l_rtdos_n;
	@FXML private Label l_rtdos_a; 
	
	// elementos del panel de consultas
	@FXML private TableView tabla_rtdos;
	@FXML private ChoiceBox<EntradaCBox> cbox_tema;
	@FXML private ChoiceBox<EntradaCBox> cbox_sesion;
	@FXML private VBox vbox_consultas;
	
	private String tema_actual;
	private boolean flag_cierre_sesion;
	
	// elementos no propios de la GUI
	private ClienteAdmin admin;
	private ModuloConsultas moduloConsultas;
	
	// mapeo para las consultas
	private Map<String,EntradaCBox> mapeoSesiones;
	private Map<String,EntradaCBox> mapeoTemas;
	private CreadorTablas creadorTablas;
	@FXML private AnchorPane panelTabla;
	@FXML private Label l_consultas_titulo;
	
	private static Label[] arregloLabel=new Label[72];
	
	
	
	public Control(){
		admin = new ClienteAdmin(this);
		flag_cierre_sesion = false;
		creadorTablas = new CreadorTablas();
		
	}
	
	@FXML
	private void Boton1Handler(Event e){
		//boton1.setText("mierda");
		//innPanel1.toFront();
		innPanel1.setVisible(true);
		innPanel2.setVisible(false);
		
		
	}
	
	@FXML
	private void Boton2Handler(Event e){
		
		innPanel1.setVisible(false);
		innPanel2.setVisible(true);
	}
	
	@FXML
	private void botonIniciarSesion(Event e){
		innPanel1.setVisible(false);
		innPanel2.setVisible(true);
	}
	
	@FXML private void botonGrillaHandler(Event e){
		 //ObservableList<Node> children=grillaSesion.getChildren() ;
		 
		int k=0;
		 for(int i=0; i<8;i++){
			 for(int j=0; j<9;j++){
				 Label etiqueta = new Label("AUSENTE");
				 etiqueta.setTextFill(Color.GRAY);
				 //grillaSesion.r;
				 grillaSesion.add(etiqueta, j, i);
				 arregloLabel[k]=etiqueta;
				 k++;
			 }
		 }
		 
		 Runnable run = new Runnable(){
			 public void run(){
				 for(int i=0; i<72;i++){
					 //
					 try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					 final int valor=i;
					 Platform.runLater(new Runnable(){
						 public void run(){
							 arregloLabel[valor].setText("CONECTADO");
							 arregloLabel[valor].setTextFill(Color.GREEN);
						 }
					 });
				 }
			 }
		 };
		 new Thread(run).start();
		
	}
	// PSEUDO-OYENTES del panel de control
	@FXML private void handler_b_iniciar_sesion(Event e){
		
		
		Runnable run = new Runnable(){
			public void run(){
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_INICIO_SESION);
				admin.enviar_msj(msj);
				Mensaje rta = admin.recibir_msj();
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					Platform.runLater(new Runnable(){public void run(){p_aceptando.toFront();}});
				}
			}
		};
		new Thread(run).start();
	}
	
	@FXML private void handler_b_detener_conexiones(Event e){
		
		Runnable run = new Runnable(){// operación dentro de un thread para que no joda a la gui
			public void run(){
				// envío msj para que deje de admitir clientes android
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_FIN_ADMISION_CLIENTES);
				admin.enviar_msj(msj);
				Mensaje rta = admin.recibir_msj();
				
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					System.out.println("# Se dejo de admitir clientes");
					// envío msj para que ver si hay quorum o no
					Mensaje msj2 = new Mensaje();
					msj2.setTipo_msj(Mensaje.TIPO_HAY_QUORUM);
					
					//try{Thread.sleep(2000);}catch(Exception e){}
					
					admin.enviar_msj(msj2);
					Mensaje rta2 = admin.recibir_msj();
					if(rta2.getTipo_msj().equals(Mensaje.TIPO_SI)){// hay quorum
						System.out.println("# Hay quorum");
						Platform.runLater(new Runnable(){public void run(){p_nuevo_tema.toFront();}});
						
					}else{// no lo hay
						// HACER ALGO CUANDO NO HAYA QUORUM!!!!!!!!!!!!!!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
						System.out.println("# NO hay quorum");
						System.out.println("# msj:"+rta2.getTipo_msj());
						Platform.runLater(new Runnable(){public void run(){p_no_hay_quorum.toFront();}});
						
					}
				}
			}
		};
		new Thread(run).start();
		
		
		
	}
	
	@FXML private void handler_b_iniciar_debate(Event e){
		tema_actual = tf_tema.getText();
		l_tema_actual_iv.setText(tema_actual);
		p_iniciar_votacion.toFront();
	}
	/*
	@FXML private void handler_b_iniciar_votacion(Event e){
		
		Runnable run = new Runnable(){
			public void run(){
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_INICIO_TEMA);
				msj.setContenido(tema_actual);
				admin.enviar_msj(msj);
				Mensaje rta = admin.recibir_msj();
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					// mostrar verificando quorum....
					boolean flag_volver_a_preguntar=false;
					do{
						Mensaje msj2 = new Mensaje();
						msj2.setTipo_msj(Mensaje.TIPO_HAY_VOTACION);
						admin.enviar_msj(msj2);
						Mensaje rta2 = admin.recibir_msj();
						if(rta2.getTipo_msj().equals(Mensaje.TIPO_SI)){
							// mostrar en votacion
							flag_volver_a_preguntar=false;
							Platform.runLater(new Runnable(){
								public void run(){
									l_tema_actual_ev.setText(tema_actual);
									p_en_votacion.toFront();
									l_tema_actual_r.setText(tema_actual);							
								}
							});
							boolean flag_volver_a_preguntar2=false;
							do{
								// preguntar por los resultados
								Mensaje msj3 = new Mensaje();
								msj3.setTipo_msj(Mensaje.TIPO_HAY_RTDOS);
								admin.enviar_msj(msj3);
								Mensaje rta3 = admin.recibir_msj();
								if(rta3.getTipo_msj().equals(Mensaje.TIPO_SI)){
									flag_volver_a_preguntar2=false;
									// mostar panel de rtdos
									Platform.runLater(new Runnable(){
										public void run(){
											p_rtdos.toFront();
										}
									});
								}else{
									flag_volver_a_preguntar2=true;
									// volver a preguntar (poner sleep????)
								}
							}while(flag_volver_a_preguntar2);

						}else if(rta2.getTipo_msj().equals(Mensaje.TIPO_NO)){
							// volver a preguntar
							flag_volver_a_preguntar=true;
						}else if(rta2.getTipo_msj().equals(Mensaje.TIPO_NO_HAY_QUORUM)){
							// mostrar que no hay quorum HACER ALGO !!!!!!!!!!!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
							flag_volver_a_preguntar=false;
						}
					}while(flag_volver_a_preguntar);
				}
			}
		};
		new Thread(run).start();
		
	}
	*/
	@FXML private void handler_b_iniciar_votacion(Event e){
		Runnable run = new Runnable(){
			public void run(){
				iniciarVotacion();
			}
		};
		new Thread(run).start();
		
	}
	private void iniciarVotacion(){
		
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_INICIO_TEMA);
				msj.setContenido(tema_actual);
				admin.enviar_msj(msj);
				System.out.println("#Se envio Iniciar Tema");
				Mensaje rta = admin.recibir_msj();
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					// mostrar verificando quorum....
					System.out.println("#Se inicio tema");
					boolean flag_volver_a_preguntar=false;
					do{
						Mensaje msj2 = new Mensaje();
						msj2.setTipo_msj(Mensaje.TIPO_HAY_VOTACION);
						admin.enviar_msj(msj2);
						Mensaje rta2 = admin.recibir_msj();
						if(rta2.getTipo_msj().equals(Mensaje.TIPO_SI)){
							// mostrar en votacion
							System.out.println("#Hay votacion");
							flag_volver_a_preguntar=false;
							Platform.runLater(new Runnable(){
								public void run(){
									l_tema_actual_ev.setText(tema_actual);
									p_en_votacion.toFront();
									l_tema_actual_r.setText(tema_actual);							
								}
							});
							boolean flag_volver_a_preguntar2=false;
							do{
								// preguntar por los resultados
								Mensaje msj3 = new Mensaje();
								msj3.setTipo_msj(Mensaje.TIPO_HAY_RTDOS);
								admin.enviar_msj(msj3);
								Mensaje rta3 = admin.recibir_msj();
								if(rta3.getTipo_msj().equals(Mensaje.TIPO_SI)){
									System.out.println("#Hay rtdos");
									flag_volver_a_preguntar2=false;
									// mostar panel de rtdos
									final int[] rtdos = ParsearRtdos.parsearRtdos(rta3.getContenido());
									Platform.runLater(new Runnable(){
										public void run(){
											l_rtdos_p.setText("Positivos: "+rtdos[ParsearRtdos.POSITIVOS]);
											l_rtdos_n.setText("Negativos: "+rtdos[ParsearRtdos.NEGATIVOS]);
											l_rtdos_a.setText("Abstenciones: "+rtdos[ParsearRtdos.ABSTENCIONES]);
											if(flag_cierre_sesion){
												//botones_rtdos.getChildren().remove(b_nuevo_tema);
												botones_rtdos.getChildren().remove(b_cerrar_sesion);
												l_comment_rtdos.setText("Si se acordó cerrar la sesión, presione \"cierre sesion\". En caso contrario seleccione \"Nuevo Tema\"");
												b_salir.setVisible(true);
											}
											p_rtdos.toFront();
										}
									});
								}else{
									System.out.println("#Aun no hay rtdos");
									flag_volver_a_preguntar2=true;
									// volver a preguntar (poner sleep????)
								}
							}while(flag_volver_a_preguntar2);

						}else if(rta2.getTipo_msj().equals(Mensaje.TIPO_NO)){
							// volver a preguntar
							System.out.println("#Aun no hay votacion");
							flag_volver_a_preguntar=true;
						}else if(rta2.getTipo_msj().equals(Mensaje.TIPO_NO_HAY_QUORUM)){
							// mostrar que no hay quorum HACER ALGO !!!!!!!!!!!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
							System.out.println("#No hay quorum");
							Platform.runLater(new Runnable(){public void run(){p_no_hay_quorum.toFront();}});
							flag_volver_a_preguntar=false;
						}
					}while(flag_volver_a_preguntar);
				}
			
	}
	
	@FXML private void handler_b_nuevo_tema(Event e){
		flag_cierre_sesion=false;
		Runnable run = new Runnable(){
			public void run(){
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_NUEVO_TEMA);
				admin.enviar_msj(msj);
				Mensaje rta = admin.recibir_msj();
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					Platform.runLater(new Runnable(){
						public void run(){
							tf_tema.setText("");
							p_nuevo_tema.toFront();
						}
					});
					
				}else{
					// metodo_Error() ?????<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
				}
			}
		};
		new Thread(run).start();
		
		
	}
	
	@FXML private void handler_b_cerrar_sesion(Event e){
		flag_cierre_sesion=true;
		tema_actual = "Cierre de la Sesion";
		Runnable run = new Runnable(){
			public void run(){
				Mensaje msj = new Mensaje();
				msj.setTipo_msj(Mensaje.TIPO_NUEVO_TEMA);
				admin.enviar_msj(msj);
				Mensaje rta = admin.recibir_msj();
				if(rta.getTipo_msj().equals(Mensaje.TIPO_OK)){
					iniciarVotacion();
				}else{
					// metodo_error() que hacemos che?
				}
			}
		};
		new Thread(run).start();
		
		
		
	}
	
	@FXML private void handler_b_login(Event e){
		String pass = pass_field.getText();
		pass_field.clear();
		if(admin.verificarPass(pass.toCharArray())){
			p_admin.toFront();
			p_login.setVisible(false);
			moduloConsultas = new ModuloConsultas(pass.toCharArray(), pass.toCharArray());
			admin.iniciar_conexion(pass.toCharArray(), pass.toCharArray());
			llenarMapeoSesiones();
			
			for(EntradaCBox entry: mapeoSesiones.values()){
				cbox_sesion.getItems().add(entry);
			}
			cbox_sesion.getSelectionModel().selectFirst();
			mapeoTemas = new Hashtable<String,EntradaCBox>();
			for(EntradaCBox entry: mapeoTemas.values()){
				cbox_tema.getItems().add(entry);
			}
			// se le agrega el listener al choiceBox (sí, es medio choto, pero el javafx no permite hacerlo de una manera mejor)
			cbox_sesion.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<EntradaCBox>() {
		        @Override 
			public void changed(ObservableValue ov, EntradaCBox viejo, EntradaCBox nuevo) {
		          
		            //System.out.println("Old Selected Option: " + options.get(oldSelected.intValue()));
		            //System.out.println("New Selected Option: " +options.get(newSelected.intValue()));
		        	if(nuevo!=null){
		        		System.out.println("NUEVO: "+nuevo.getValue());
		        		String idSesion=nuevo.getKey();
		        		llenarMapeoTemas(idSesion);
		        		cbox_tema.getSelectionModel().clearSelection();
		        		cbox_tema.getItems().clear();
		        		for(EntradaCBox entry: mapeoTemas.values()){
		        			cbox_tema.getItems().add(entry);
		        		}
		        		cbox_tema.getSelectionModel().selectFirst();
		        	}
		            
		        }    
		    });
			// hacer algo si no se inicia la conexion
		}else{
			l_login.setVisible(true);
		}
		
	}
	
	@FXML private void handler_b_salir(Event e){
		admin.cerrar_conexion();
		moduloConsultas.cerrar();
		try {
			Thread.sleep(500);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Platform.exit();
		System.exit(0);
	}
	@FXML private void handler_b_consulta_rtdos(Event e){
		
		//tabla_rtdos.getChildren()
		EntradaCBox sesion=(EntradaCBox)cbox_sesion.getValue();
		String id_sesion = sesion.getKey();

		if(mapeoTemas.values().size()>0){ // si en la sesion seleccionada hay temas
			EntradaCBox tema = (EntradaCBox)cbox_tema.getValue();
			String idTema= tema.getKey();

			MensajeConsulta msj = new MensajeConsulta(MensajeConsulta.CONSULTA_RTDOS_VOTACION);
			msj.agregarParametro("idSesion", id_sesion);
			msj.agregarParametro("idTema", idTema);
			//efectuarConsulta(msj);
			efectuarConsultaRtdos(msj, sesion.getValue(), tema.getValue());
		
		}else{
			// NO HAY RTDOS!!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
			System.out.println("NO HAY TEMA EN ESTA SESION");
		}
		
	}
	@FXML private void handler_b_consulta_detalle(Event e){
		
		
		//tabla_rtdos.getChildren()
				EntradaCBox entradaSesion = (EntradaCBox)cbox_sesion.getValue(); 
				String id_sesion = entradaSesion.getKey();

				if(mapeoTemas.values().size()>0){ // si en la sesion seleccionada hay temas
					EntradaCBox entradaTema = (EntradaCBox)cbox_tema.getValue(); 
					String idTema= entradaTema.getKey();

					MensajeConsulta msj = new MensajeConsulta(MensajeConsulta.CONSULTA_VOTOS_CLIENTE);
					msj.agregarParametro("idSesion", id_sesion);
					msj.agregarParametro("idTema", idTema);
					//efectuarConsulta(msj);
					efectuarConsultaVotacion(msj, entradaSesion.getValue(), entradaTema.getValue());
				
				}else{
					// NO HAY RTDOS!!!! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
					System.out.println("NO HAY TEMA EN ESTA SESION");
				}
		
	}
	@FXML private void handler_b_consulta_clientes(Event e){
		EntradaCBox entrada=(EntradaCBox)cbox_sesion.getValue();
		String id_sesion = entrada.getKey();

		MensajeConsulta msj = new MensajeConsulta(MensajeConsulta.CONSULTA_CLIENTES_DE_SESION);
		msj.agregarParametro("idSesion", id_sesion);
		//efectuarConsulta(msj);
		efectuarConsultaClientes(msj,entrada.getValue());
		
				
		
	}
	@FXML private void hanbler_b_consulta_refresh(Event e){
		llenarMapeoSesiones();
		cbox_sesion.getSelectionModel().clearSelection();
		cbox_sesion.getItems().clear();
		
		if(mapeoSesiones.size()>0){
			for(EntradaCBox entry: mapeoSesiones.values()){
				cbox_sesion.getItems().add(entry);
			}
			cbox_sesion.getSelectionModel().selectFirst();
			
			String id_sesion = cbox_sesion.getValue().getValue();
			mapeoTemas = llenarMapeoTemas(id_sesion);
			
			cbox_tema.getSelectionModel().clearSelection();
			cbox_tema.getItems().clear();
			for(EntradaCBox entry: mapeoTemas.values()){
				cbox_tema.getItems().add(entry);
			}
			cbox_tema.getSelectionModel().selectFirst();
		}
	}
	
	private void llenarMapeoSesiones(){
		mapeoSesiones=new Hashtable<String,EntradaCBox>();
		MensajeConsulta consulta = new MensajeConsulta(MensajeConsulta.CONSULTA_SESIONES);
		
		moduloConsultas.enviarConsulta(consulta);
		Document rtaConsulta=moduloConsultas.recibirRespuesta();
		
		Element nodos=rtaConsulta.getDocumentElement();
		
		NodeList entradas = nodos.getElementsByTagName("entrada");
		
		// recorrer entradas
		for(int i=0; i<entradas.getLength(); i++){
			
			NodeList campos = entradas.item(i).getChildNodes();
			
			String id=campos.item(0).getTextContent();
			String fecha=campos.item(1).getTextContent();
			
			mapeoSesiones.put(id,new EntradaCBox(id,fecha));
		}
		
	}
	
	private Map<String,EntradaCBox> llenarMapeoTemas(String idSesion){
		mapeoTemas=new Hashtable<String,EntradaCBox>();
		MensajeConsulta consulta = new MensajeConsulta(MensajeConsulta.CONSULTA_TEMAS_DE_SESION);
		consulta.agregarParametro("idSesion", idSesion);
		
		moduloConsultas.enviarConsulta(consulta);
		Document rtaConsulta=moduloConsultas.recibirRespuesta();
		
		Element nodos=rtaConsulta.getDocumentElement();
		
		NodeList entradas = nodos.getElementsByTagName("entrada");
		
		// recorrer entradas
		for(int i=0; i<entradas.getLength(); i++){
			
			NodeList campos = entradas.item(i).getChildNodes();
			
			String id=campos.item(0).getTextContent();
			String tema=campos.item(1).getTextContent();
			
			mapeoTemas.put(id,new EntradaCBox(id,tema));
		}
		return mapeoTemas;
		
	}	

private void efectuarConsultaClientes(final MensajeConsulta consulta, String fecha){
	
	vbox_consultas.setDisable(true);
		Runnable run = new Runnable(){
			public void run(){
				//AreaRtasConsultas.setText("Esperando respuesta del servidor...");
				moduloConsultas.enviarConsulta(consulta);
				Document rtaConsulta=moduloConsultas.recibirRespuesta();
				
				StringBuffer buffer=new StringBuffer();
				ObservableList<CreadorTablas.Cliente> datos = FXCollections.observableArrayList();
				
				Element nodos=rtaConsulta.getDocumentElement();
				
				NodeList entradas = nodos.getElementsByTagName("entrada");
				
				// colocar nbres de columnas
				if(entradas.getLength()>0){
					{
						// creo que esto es para obtener los nombres de las columnas
						NodeList campos = entradas.item(0).getChildNodes();
						
						for(int k=0; k<campos.getLength(); k++){
							Element campo = (Element) campos.item(k);
							//buffer.append(campo.getNodeName().toUpperCase()+"\t\t");
						}
					}
					//buffer.append("\n");
					// colocar entradas
					for(int i=0; i<entradas.getLength(); i++){
						
						NodeList campos = entradas.item(i).getChildNodes();
						
						//for(int j=0; j<campos.getLength(); j++){
							Element campoN = (Element) campos.item(0);
							buffer.append(campoN.getTextContent()+"\t\t");
							
							Element campoA = (Element) campos.item(1);
							buffer.append(campoA.getTextContent()+"\t\t");
							
							datos.add(new CreadorTablas.Cliente(campoN.getTextContent(),campoA.getTextContent()));
							
							final TableView tabla = creadorTablas.crearTablaClientes(datos);
						//}
							
						buffer.append("\n");
						Platform.runLater(new Runnable(){
							@Override
							public void run() {
								l_consultas_titulo.setText("Resultado de los Asambleistas Presentes en la Sesion del "+fecha);
								panelTabla.getChildren().removeAll(panelTabla.getChildren());
								AnchorPane.setTopAnchor(tabla, 0.0);
								AnchorPane.setBottomAnchor(tabla, 0.0);
								AnchorPane.setLeftAnchor(tabla, 0.0);
								AnchorPane.setRightAnchor(tabla, 0.0);
								panelTabla.getChildren().add(tabla);
								
							}
							
						});
						
					}
				}else{
					buffer.append("La consulta no devolv�o resultados");
				}
				System.out.println(buffer.toString());
				Platform.runLater(new Runnable(){public void run(){vbox_consultas.setDisable(false);}});
			};
		};
		
		Thread threadConsulta = new Thread(run);
		threadConsulta.start();
	}
private void efectuarConsultaVotacion(final MensajeConsulta consulta, String fecha, String tema){
	
	vbox_consultas.setDisable(true);
		Runnable run = new Runnable(){
			public void run(){
				//AreaRtasConsultas.setText("Esperando respuesta del servidor...");
				moduloConsultas.enviarConsulta(consulta);
				Document rtaConsulta=moduloConsultas.recibirRespuesta();
				
				StringBuffer buffer=new StringBuffer();
				ObservableList<CreadorTablas.Voto> datos = FXCollections.observableArrayList();
				
				Element nodos=rtaConsulta.getDocumentElement();
				
				NodeList entradas = nodos.getElementsByTagName("entrada");
				
				// colocar nbres de columnas
				if(entradas.getLength()>0){
					{
						// creo que esto es para obtener los nombres de las columnas
						NodeList campos = entradas.item(0).getChildNodes();
						
						for(int k=0; k<campos.getLength(); k++){
							Element campo = (Element) campos.item(k);
							//buffer.append(campo.getNodeName().toUpperCase()+"\t\t");
						}
					}
					//buffer.append("\n");
					// colocar entradas
					for(int i=0; i<entradas.getLength(); i++){
						
						NodeList campos = entradas.item(i).getChildNodes();
						
						//for(int j=0; j<campos.getLength(); j++){
							Element campoN = (Element) campos.item(0);
							buffer.append(campoN.getTextContent()+"\t\t");
							
							Element campoA = (Element) campos.item(1);
							buffer.append(campoA.getTextContent()+"\t\t");
							
							Element campoV = (Element) campos.item(2);
							buffer.append(campoV.getTextContent()+"\t\t");
							
							datos.add(new CreadorTablas.Voto(campoN.getTextContent(),campoA.getTextContent(),campoV.getTextContent()));
							
							final TableView tabla = creadorTablas.crearTablaDetalles(datos);
						//}
							
						buffer.append("\n");
						Platform.runLater(new Runnable(){
							@Override
							public void run() {
								l_consultas_titulo.setText("Detalle de los votos para el tema \""+tema+"\" en la Sesion del "+fecha);
								panelTabla.getChildren().removeAll(panelTabla.getChildren());
								AnchorPane.setTopAnchor(tabla, 0.0);
								AnchorPane.setBottomAnchor(tabla, 0.0);
								AnchorPane.setLeftAnchor(tabla, 0.0);
								AnchorPane.setRightAnchor(tabla, 0.0);
								panelTabla.getChildren().add(tabla);
								
							}
							
						});
						
					}
				}else{
					buffer.append("La consulta no devolv�o resultados");
				}
				System.out.println(buffer.toString());
				Platform.runLater(new Runnable(){public void run(){vbox_consultas.setDisable(false);}});
			};
		};
		
		Thread threadConsulta = new Thread(run);
		threadConsulta.start();
	}	
private void efectuarConsultaRtdos(final MensajeConsulta consulta, String fecha,String tema){
	
	vbox_consultas.setDisable(true);
		Runnable run = new Runnable(){
			public void run(){
				//AreaRtasConsultas.setText("Esperando respuesta del servidor...");
				moduloConsultas.enviarConsulta(consulta);
				Document rtaConsulta=moduloConsultas.recibirRespuesta();
				
				StringBuffer buffer=new StringBuffer();
				ObservableList<CreadorTablas.Rtdo> datos = FXCollections.observableArrayList();
				
				Element nodos=rtaConsulta.getDocumentElement();
				
				NodeList entradas = nodos.getElementsByTagName("entrada");
				
				// colocar nbres de columnas
				if(entradas.getLength()>0){
					{
						// creo que esto es para obtener los nombres de las columnas
						NodeList campos = entradas.item(0).getChildNodes();
						
						for(int k=0; k<campos.getLength(); k++){
							Element campo = (Element) campos.item(k);
							//buffer.append(campo.getNodeName().toUpperCase()+"\t\t");
						}
					}
					//buffer.append("\n");
					// colocar entradas
					for(int i=0; i<entradas.getLength(); i++){
						
						NodeList campos = entradas.item(i).getChildNodes();
						
						//for(int j=0; j<campos.getLength(); j++){
							Element campoRtdo = (Element) campos.item(0);
							buffer.append(campoRtdo.getTextContent()+"\t\t");
							
							int[] rtdo = ParsearRtdos.parsearRtdos(campoRtdo.getTextContent());
							System.out.println("#"+rtdo[0]+"\n#"+rtdo[1]+"\n#"+rtdo[2]);
							CreadorTablas.Rtdo entrada = new CreadorTablas.Rtdo(rtdo[ParsearRtdos.POSITIVOS], rtdo[ParsearRtdos.NEGATIVOS], rtdo[ParsearRtdos.ABSTENCIONES]);
							datos.add(entrada);
							
							final TableView tabla = creadorTablas.crearTablaRtdos(datos);
						//}
							
						buffer.append("\n");
						Platform.runLater(new Runnable(){
							@Override
							public void run() {
								l_consultas_titulo.setText("Resultado de la votacion del tema \""+tema+"\" en la fecha "+fecha);
								panelTabla.getChildren().removeAll(panelTabla.getChildren());
								AnchorPane.setTopAnchor(tabla, 0.0);
								AnchorPane.setBottomAnchor(tabla, 0.0);
								AnchorPane.setLeftAnchor(tabla, 0.0);
								AnchorPane.setRightAnchor(tabla, 0.0);
								panelTabla.getChildren().add(tabla);
								
							}
							
						});
						
					}
				}else{
					buffer.append("La consulta no devolv�o resultados");
				}
				System.out.println(buffer.toString());
				Platform.runLater(new Runnable(){public void run(){vbox_consultas.setDisable(false);}});
			};
		};
		
		Thread threadConsulta = new Thread(run);
		threadConsulta.start();
	}
	
	private class EntradaCBox{
		private String key;
		private String value;
		public EntradaCBox(String k, String v){
			setKey(k);
			setValue(v); 
		}
		public String getKey() {
			return key;
		}
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
		public String toString() {
			return value;
		}
		public void setKey(String key) {
			this.key = key;
		}
	}
	
}
